﻿#pragma once
#ifndef WRVECTOR_H
#define WRVECTOR_H

#include "../WRBasics.h"
#ifdef WRDEBUG
#include "../Runtime/WRException.h"
#endif

//表示向量。
template <class T> class WRVector
{
private:
    T* m_data;
    WRu m_size;

public:
    //初始化向量。
    inline WRVector(void)
    {
        m_data = 0;
        m_size = 0;
    }
    //初始化向量。
    inline WRVector(T* data, WRu size)
    {
        m_data = data;
        m_size = size;
    }

    //获取数据数量。
    inline WRu size(void) const
    {
        return m_size;
    }

    //获取数据内容。
    inline const T* data(void) const
    {
        return m_data;
    }
    //获取数据内容。
    inline T* data(void)
    {
        return m_data;
    }

    //获取指定起始位置的数据。
    inline const T* data(WRu start) const
    {
#ifdef WRDEBUG
        if (start >= m_size)
        {
            throw WRArgumentOutOfRangeException();
        }
#endif
        return m_data + start;
    }
    //获取指定起始位置的数据。
    inline T* data(WRu start)
    {
#ifdef WRDEBUG
        if (start >= m_size)
        {
            throw WRArgumentOutOfRangeException();
        }
#endif
        return m_data + start;
    }

    //获取指定位置的数据值。
    inline const T& operator[](WRu index) const
    {
#ifdef WRDEBUG
        if (index >= m_size)
        {
            throw WRArgumentOutOfRangeException();
        }
#endif
        return m_data[index];
    }
    //获取指定位置的数据值。
    inline T& operator[](WRu index)
    {
#ifdef WRDEBUG
        if (index >= m_size)
        {
            throw WRArgumentOutOfRangeException();
        }
#endif
        return m_data[index];
    }
};

#endif // WRVECTOR_H

